{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理\n",
    "***\n",
    "***\n",
    "Time: 2020-09-07<br>\n",
    "Author: dsy\n",
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 数据平衡\n",
    "#### 1.1 为什么要对数据进行采样平衡\n",
    "- 下采样：克服高维特征以及大量数据导致的问题,有助于降低成本,缩短时间甚至提升效果\n",
    "- 上采样：均衡正负样本的数据，避免数据不平衡导致分类器对正负样本的有偏训练\n",
    "    - 比如99%为正样本，1%为负样本，如果分类器把所以样本预测为正样本则准确率高达99%，显然不符合实际情况\n",
    "\n",
    "#### 1.2 是否一定需要对原始数据进行采样平衡\n",
    "否。\n",
    "- 采样前后会对原始数据的分布进行改变，可能导致泛化能力大大下降\n",
    "- 采样有一定概率会造成过拟合，当原始数据过少而采样量又很大当时候，造成大量数据被重复，造成模型训练的结果有一定的过拟合\n",
    "\n",
    "#### 1.3 有哪些常见的采样方法？\n",
    "- 随机采样\n",
    "    - 无放回的简单抽样：每条样本被采到的概率相等且都为1/N\n",
    "    - 有放回的简单抽样：每条样本可能多次被选中\n",
    "    - 上采样：即合理地增加少数类的样本\n",
    "    - 下采样：欠抽样技术是将数据从原始数据集中移除\n",
    "    - 平衡采样：考虑正负样本比\n",
    "    - 分层采样：通过某一些feature对数据进行切分，按照切分后的占比分别进行采样\n",
    "    - 整体采样：先将数据集T中的数据分组成G个互斥的簇,然后再从G个簇中简单随机采样s个簇作为样本集\n",
    "- 合成采样\n",
    "相对于采样随机的方法进行上采样, 还有两种比较流行的上采样的改进方式： \n",
    "    - SMOTE\n",
    "        - x_new = x + rand(0,1) * (x′−x)\n",
    "        - **带来新样本的同时有可能造成不同类别样本之间的重合**\n",
    "        - Borderline-SMOTE为了解决上面的问题，在x_new生成之前，会先判断x这个点是否周围都是同类别的点\n",
    "    - ADASYN\n",
    "        - 同上，也是在构造样本点的过程中考虑了正负样本比\n",
    "- 平衡欠采样        \n",
    "    - EasyEnsemble，利用模型融合的方法（Ensemble）\n",
    "        - 少样本不变，多样本拆分成N份，分别组合进行模型训练后进行模型融合\n",
    "    - BalanceCascade，利用模型融合的方法（Boost）\n",
    "        - 每次剔除预测正确的多数样本，加入新的未预测的多数样本\n",
    "    - NearMiss\n",
    "        - 选择离各种情况下的少数样本位置最远的多数样本进行训练                \n",
    "\n",
    "#### 1.4 能否避免采样？\n",
    "可以通过修改模型训练中的loss权重，比如罗辑回归中进行case_weight的调整，adaboost中对样本错分权重的改变等等。\n",
    "\n",
    "#### 1.5 你平时怎么用采样方法？\n",
    "尽量避免使用合成采样的方式去做数据填充，总结如下：\n",
    "- 由于项目中时间的充裕问题，填充的结果往往是正负样本交叠且无感知的，会干扰分类器\n",
    "- 通常我们引入的特征不仅仅是连续变量，在分类变量上合成采样表现并不优秀\n",
    "- 合成采样往往无法与后序模型进行结合使用，比如随机采样可以引入模型交叉，比如平衡欠采样可以引入模型融合"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 异常点处理\n",
    "#### 2.1 统计方法\n",
    "- 3∂原则\n",
    "    - 数据需要服从正态分布\n",
    "    - 只能解决一维问题：![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m954lh5tj301h00gdfl.jpg)\n",
    "- 基于正态分布的离群点检测方法\n",
    "    - 一元高斯分布校验：![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m91basuwj306201h0sl.jpg)，如果概率值大小离群则代表为异常点\n",
    "    - 多元高斯分布检测：\n",
    "        - 假设 n 维的数据集合 ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9e4sjkoj303000it8l.jpg)，可以计算 n 维的均值向量![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9ewbb1cj304b00igli.jpg)\n",
    "        - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9fdr3xfj30140080sl.jpg)的协方差矩阵：![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9fly7rpj306g00ja9z.jpg)\n",
    "        - 得到![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9gzmd1cj30bz01874b.jpg) \n",
    "    - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m92kshc2j30d6073dft.jpg)\n",
    "- 马氏距离\n",
    "    - 假设![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9kw2qf3j300900awec.jpg)是均值向量，其中S是协方差矩阵。\n",
    "    - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9kguzdgj307e00lmx3.jpg)\n",
    "- ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9rdqiqjj300g00h0sl.jpg)统计检验\n",
    "    - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9ryphxxj304u00kmx2.jpg)\n",
    "    - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9sgjwk1j300d00awec.jpg)是a在第i维上的取值,![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8m9sljfhpj300g00e0sl.jpg)是所有对象在第 i 维的均值，n是维度\n",
    "- 箱型图\n",
    "    - IQR，\\[Q1-3/2(Q3-Q1),Q3+3/2(Q3-Q1)]\n",
    "\n",
    "#### 2.2 矩阵分解方法\n",
    "- PCA\n",
    "    - 去除均值后的协方差矩阵对应的特征值和特征向量，按照特征值排序，topN个特征向量组成新的低维空间\n",
    "    - 核心：在于组合原始的特征，使得新的原始数据在新的低维度空间中的方差更大，特征更有区分力\n",
    "    - 问题是没有做到剔除，只是对空间上的表现进行了优化，尽可能的压缩异常点在新空间中作用\n",
    "- SVD\n",
    "    - 假设 dataMat 是一个 p 维的数据集合，有 N 个样本，它的协方差矩阵是 X。那么协方差矩阵就通过奇异值分解写成：![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8man1o3trj302h00hmx1.jpg)\n",
    "    - 其中 P 是一个 (p,p) 维的正交矩阵，它的每一列都是 X 的特征向量。D 是一个 (p,p) 维的对角矩阵，包含了特征值 ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8manhjc7qj301n00ga9x.jpg)。\n",
    "    - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8mar6eb43j304300h746.jpg)可以认为是dataMat在主成分topj上的映射\n",
    "    - 最后还需要拉回原空间：![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8mb1hmrmnj306w00i747.jpg)\n",
    "    - 异常值分数（outlier score）：![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8maynk5wkj30a300mjrc.jpg) + ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8mayu64x7j305500mt8m.jpg)\n",
    "\n",
    "#### 2.3 特征值和特征向量的本质是什么？\n",
    "- 一个特征向量可以看成 2 维平面上面的一条线，或者高维空间里面的一个超平面\n",
    "- 特征向量所对应的特征值反映了这批数据在这个方向上的拉伸程度 \n",
    "\n",
    "#### 2.4 矩阵乘法的实际意义？\n",
    "- 两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。\n",
    "- 矩阵点乘向量的意义是将右边的向量变换到左边矩阵中每一行行向量为基所表示的空间中去。\n",
    "\n",
    "#### 2.5 密度的离群点检测\n",
    "- 定义密度为到k个最近邻的平均距离的倒数。如果该距离小，则密度高，反之亦然。另一种密度定义是使用DBSCAN聚类算法使用的密度定义，即一个对象周围的密度等于该对象指定距离d内对象的个数。\n",
    "    - 我们可以通过随机选择联通点，人为设置联通点附近最小半径a，半径内最小容忍点个数b，再考虑密度可达，形成蓝色方框内的正常数据区域，剩下的黄色区域内的点即为异常点。\n",
    "- Local Outlier Factor算法\n",
    "- 孤立森林:![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8mcoswixrj30iy0em0tb.jpg)\n",
    "    - 经验1：每棵树的最大深度limit length=ceiling(log2(样本大小))\n",
    "    - 经验2：树的个数在256棵以下\n",
    "缺点：\n",
    "    - 计算量大：o(n^2)\n",
    "    - 需要人为选择阈值\n",
    "    \n",
    "#### 2.6 聚类的离群点检测\n",
    "- 一个对象是基于聚类的离群点，如果该对象不强属于任何簇，那么该对象属于离群点。\n",
    "- 缺点也就是聚类的缺点，包括初始点对结果的影响，数据是否保持凸型对结果对影响，簇的个数的选择\n",
    "\n",
    "#### 2.7 如何处理异常点？\n",
    "- 删除含有异常值的记录：直接将含有异常值的记录删除；\n",
    "- 视为缺失值：将异常值视为缺失值，利用缺失值处理的方法进行处理；\n",
    "- 平均值修正：可用前后两个观测值的平均值修正该异常值；\n",
    "- 生成列新特征：category异常\n",
    "- 不处理：直接在具有异常值的数据集上进行数据挖掘；"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 缺失值处理\n",
    "#### 3.1 是不是一定需要对缺失值处理？\n",
    "当缺失值占比在可接受的范围以内的时候才需要进行填充，如果缺失值大于50%以上的时候，可以选择进行二分化，如果缺失值大于80%可以完整删除该列而不是强行去填充\n",
    "\n",
    "#### 3.2 直接填充方法有哪些？\n",
    "- 均值\n",
    "- 中位数\n",
    "- 众数\n",
    "- 分位数\n",
    "\n",
    "#### 3.3 模型插值方法有哪些？及方法的问题\n",
    "- 有效性存疑，取决于特征列数\n",
    "    - 生成的插值来源于其他列的特征，是不是意味着插值的结果已经是和其他列的组合高相关\n",
    "\n",
    "#### 3.4 如何直接离散化？\n",
    "- 离散特征新增缺失的category\n",
    "\n",
    "#### 3.5 hold位填充方法有哪些？\n",
    "把全部结果都embedding化，对空值或者缺失值按照一定规则生成若干个hold位，以hold位的向量结果作为缺失值的结果\n",
    "    - 可以参考YouTube中的新商品向量生成逻辑\n",
    "    - bert中的\\[UNK]向量，\\[unused]向量\n",
    "    \n",
    "#### 3.6 怎么理解分布补全？\n",
    "如果我们能在原始数据上发现明显规律，比如整体数据满足高维多元高斯分布，则可以通过未知列补全缺失列的值\n",
    "\n",
    "#### 3.7 random方法\n",
    "在缺失量特别少(通常认为小于1%)的时候，可以随机生成\n",
    "\n",
    "#### 3.8 总结\n",
    "- 实际机器学习工程中，直接删除、众数填充和直接离散化方法用的最多\n",
    "    - 快速\n",
    "    - 对原始数据的前提假设最少，也不会影响到非缺失列\n",
    "- 在深度学习中，hold位填充方法用的最多\n",
    "    - 在大量数据的拟合条件下，能保证这些未知数据处的向量也能得到收敛\n",
    "    - 而且通过随机构造的特性，保证了缺失处的\\[UNK]向量，\\[unused]向量的通配性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. 特征选择\n",
    "#### 4.1 为什么要做特征选择？\n",
    "- 耗时：特征个数越多，分析特征、训练模型所需的时间就越长。\n",
    "- 过拟合：特征个数越多，容易引起“维度灾难”，模型也会越复杂，其推广能力会下降。    \n",
    "- 共线性：单因子对目标的作用被稀释，解释力下降\n",
    "\n",
    "#### 4.2 从哪些方面可以做特征选择？\n",
    "- 方差，是的feature内的方向更大，对目标区分度提高更高贡献\n",
    "- 相关性，与区分目标有高相关的特征才有意义\n",
    "\n",
    "#### 4.3 既然说了两个方向，分别介绍一些吧\n",
    "- 方差\n",
    "    - 移除低方差特征\n",
    "        - 移除低方差特征是指移除那些方差低于某个阈值，即特征值变动幅度小于某个范围的特征，这一部分特征的区分度较差，我们进行移除\n",
    "    - 考虑有值数据中的占比，异常数据的占比，正常范围数据过少的数据也可以移除\n",
    "- 相关性\n",
    "    - 单变量特征选择：单变量特征是基于单一变量和目标y之间的关系，通过计算某个能够度量特征重要性的指标，然后选出重要性Top的K个特征。但是这种方式有一个缺点就是忽略了特征组合的情况\n",
    "        - 皮尔森相关系数:![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8n46pedyoj303e019t8i.jpg)\n",
    "        - Fisher得分:![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8n4jajze8j31hc0u0dt2.jpg)\n",
    "        - 假设检验\n",
    "            - 卡方检验\n",
    "            - ANOVA\n",
    "        - 熵检验\n",
    "            - 互信息熵\n",
    "                - 度量两个变量之间的相关性,互信息越大表明两个变量相关性越高;互信息为0,两个变量越独立\n",
    "            - KL散度\n",
    "            - 相对熵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "        \n",
    "### 5. 特征提取\n",
    "#### 5.1 为什么需要对数据进行变换？\n",
    "- 避免异常点：比如对连续变量进行份桶离散化\n",
    "- 可解释性或者需要连续输出：比如评分卡模型中的iv+woe\n",
    "- 使得原始数据的信息量更大：比如log/sqrt变换\n",
    "\n",
    "#### 5.2 归一化和标准化之间的关系？\n",
    "- 归一化(max-min)\n",
    "    - 缩放仅仅跟最大、最小值的差别有关，只是一个去量纲的过程\n",
    "\n",
    "- 标准化(z-score)\n",
    "    - 缩放和所有点都相关，数据相对分布不会改变，集中的数据标准化后依旧集中\n",
    "\n",
    "- 作用\n",
    "    - 解决部分模型由于数据值域不同对模型产生的影响，尤其是距离模型\n",
    "    - 更快的收敛\n",
    "    - 去量纲化\n",
    "    - 避免数值计算溢出\n",
    "    \n",
    "- 总结\n",
    "    - 异常点角度：特征数据上下限明显异常的时候使用标准化方法，简单归一化会造成数据差异模糊，整体方差下降\n",
    "    - 分布角度：使用标准化之前，要求数据需要近似满足高斯分布，不然会改变数据的分布，尤其是对数据分布有强假设的情况下\n",
    "    - 上线变动角度：归一化在上线的时候需要考虑上下约束届是否需要变动，标准化则不需要考虑变动\n",
    "    - 值域范围角度：归一化对数据范围约定较为固定，而标准化的输出上下届则不定\n",
    "    - 模型角度：一般涉及距离计算，协方差计算，数据满足高斯分布的情况下用标准化，其他归一化或其他变换\n",
    "\n",
    "- 常用模型    \n",
    "    - knn：计算距离，不去量冈则结果受值域范围影响大\n",
    "    - neural network：梯度异常问题+激活函数问题\n",
    "        \n",
    "#### 5.3 连续特征常用方法\n",
    "- 截断\n",
    "    - 连续型的数值进行截断或者对长尾数据进行对数后截断(保留重要信息的前提下对特征进行截断,截断后的特征也可以看作是类别特征)\n",
    "    - 参考异常点里面的outlier识别，以最大值填充或者以None\n",
    "- 二值化\n",
    "    - 数据分布过于不平衡\n",
    "    - 空值/异常值过多\n",
    "- 分桶\n",
    "    - 小范围连续数据内不存在逻辑关系，比如31岁和32岁之间不存在明显的差异，可以归为一类\n",
    "    - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8n2hcomdwj30k60djdh4.jpg)\n",
    "- 离散化    \n",
    "    - 数值无意义，比如学历、祖籍等等\n",
    "- 缩放\n",
    "    - z-score标准化\n",
    "    - min-max归一化\n",
    "    - 范数归一化:![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8mf5xdj2sj3031011jr6.jpg)\n",
    "        - L1范数\n",
    "        - L2范数\n",
    "    - 平方根缩放\n",
    "    - 对数缩放\n",
    "        - 对数缩放适用于处理长尾分且取值为正数的数值变量\n",
    "            - 它将大端长尾压缩为短尾，并将小端进行延伸\n",
    "        - 可以把类似较差的特征线性化，比如x1x2/y，log变换后变成了log(x1)+log(x2)-log(y)\n",
    "        - 可以把有偏分布修正为近似正太分布\n",
    "    - Box-Cox转换\n",
    "        - ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8mfjjwir3j309m038gln.jpg)\n",
    "        - 通过因变量的变换，使得变换后的y(λ)与自变量具有线性依托关系。因此，Box-Cox变换是通过参数的适当选择，达到对原来数据的“综合治理”，使其满足一个线性模型条件\n",
    "- 特征交叉\n",
    "    - 人为分段交叉\n",
    "        - 提升模型的拟合能力，使基向量更有表示能力。比如，本来是在二维空间解释一个点的意义，现在升维到三维后解释\n",
    "        - 离散变量的交并补\n",
    "        - 连续变量的点积，attention类似\n",
    "        - 交叉中需要并行特征筛选的步骤\n",
    "            - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8n2rf5aawj30ka0j6q48.jpg)\n",
    "    - 自动组合\n",
    "        - FM/FFM中的矩阵点积\n",
    "            - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8n2un2ckzj30eb07jaan.jpg)\n",
    "        - Neural Network里面的dense\n",
    "            - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8n2vb1nnij30co07lt94.jpg)\n",
    "    - 条件选择\n",
    "        - 通过树或者类似的特征组合模型去做最低熵的特征选择\n",
    "            - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8n2t44a2mj30im0bt0tz.jpg)\n",
    "            - ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8n2v20wjbj30hs0dx0tq.jpg)\n",
    "            \n",
    "- 非线性编码\n",
    "    - 核向量进行升维\n",
    "    - 树模型的叶子结点的stack\n",
    "    - 谱聚类/pca/svd等信息抽取编码\n",
    "    - lda/EM等分布拟合表示\n",
    "\n",
    "#### 5.4 离散特征常用方法\n",
    "- one-hot-encoder\n",
    "- 分层编码\n",
    "    - 有一定规律的类别数据，邮政编码，手机号等等\n",
    "- 计数编码\n",
    "    - 将类别特征用其对应的计数来代替,这对线性和非线性模型都有效\n",
    "    - 对异常值比较敏感,特征取值有可能冲突\n",
    "- 计数排名编码\n",
    "    - 解决上述问题，以排名代替值\n",
    "- Embedding\n",
    "    - 对于基数(类别变量所有可能不同取值的个数)很大的离散特征，简单模型任意欠拟合,而复杂模型任意过拟合;对于独热编码,得到的特征矩阵太稀疏.对于高基数类别变量,有效方式是基于目标变量对类别特征进行编码,即有监督的编码方式,适用于分类和回归问题\n",
    "- 类别特征之间交叉组合\n",
    "    - 笛卡尔交叉\n",
    "- 类别特征和数值特征之间交叉组合\n",
    "    - 均值、中位数、标准差、最大值和最小值\n",
    "    - 分位数、方差、vif值、分段冲量\n",
    "\n",
    "#### 5.5 文本特征\n",
    "- 预处理手段有哪些？\n",
    "    - 将字符转化为小写\n",
    "    - 分词\n",
    "    - 去除无用字符\n",
    "    - 繁体转中文\n",
    "    - 去除停用词\n",
    "    - 去除稀有词\n",
    "    - 半角全角切换\n",
    "    - 错词纠正\n",
    "    - 关键词标记\n",
    "        - TF-IDF\n",
    "        - LDA\n",
    "        - LSA\n",
    "    - 提取词根\n",
    "    - 词干提取\n",
    "    - 标点符号编码\n",
    "    - 文档特征\n",
    "    - 实体插入和提取\n",
    "    - 文本向量化\n",
    "        - word2vec\n",
    "        - glove\n",
    "        - bert\n",
    "    - 文本相似性\n",
    "- 如何做样本构造？\n",
    "    - 按标点切分\n",
    "    - 按句切分\n",
    "    - 对话session切分\n",
    "    - 按文章切分\n",
    "    - 按场景切分\n",
    "- 分词过程中会考虑哪些方面？\n",
    "    - 词性标注\n",
    "    - 词形还原和词干提取\n",
    "        - 词形还原为了通用性特征的提取\n",
    "        - 词干提取为了去除干扰词把训练注意力集中在关键词上，同时提高速度；缺点是不一定词干代表完整句义\n",
    "- 文本中的统计信息一般有哪些？\n",
    "    - 直接统计值：\n",
    "        - 文本的长度\n",
    "        - 单词个数\n",
    "        - 数字个数\n",
    "        - 字母个数\n",
    "        - 大小写单词个数\n",
    "        - 大小写字母个数\n",
    "        - 标点符号个数\n",
    "        - 特殊字符个数\n",
    "        - 数字占比\n",
    "        - 字母占比\n",
    "        - 特殊字符占比\n",
    "        - 不同词性个数    \n",
    "    - 直接统计值的统计信息：\n",
    "        - 最小最大均值方差标准差\n",
    "        - 分位数，最早/最晚出现位置\n",
    "- 直接对文本特征进行整理手段有哪些？   \n",
    "    - N-Gram模型\n",
    "        - 将文本转换为连续序列，扩充样本特征\n",
    "        - 连续语意的提取\n",
    "    - TF-IDF\n",
    "        - 权重评分，去除掉一些低重要性的词，比如每篇文章都出现的\"的\"，\"了\"\n",
    "    - LDA\n",
    "        - 主题抽取，用狄利克雷分布去拟合出文章和主题之间的关系\n",
    "    - 相似度\n",
    "        - 余弦相似度\n",
    "        - Jaccard相似度\n",
    "            - 共现性\n",
    "        - Levenshtein(编辑距离)\n",
    "            - 文本近似程度\n",
    "        - 海林格距离\n",
    "            - 用来衡量概率分布之间的相似性\n",
    "        - JSD\n",
    "            - 衡量prob1 和 prob2两个分布的相似程度\n",
    "    - 向量化\n",
    "        - word2vec\n",
    "        - glove\n",
    "        - bert\n",
    "- 文本处理有大量可以讲，可以谈的，以上只是做了一个最简单的汇总，详细的会在自然语言处理的专题一条一条分析，面试官也一定会就每个知识点进行展开\n",
    "\n",
    "#### 5.6 画一个最简单的最快速能实现的框架\n",
    "- 建议不要上来就transfer+attention+bert+xlnet，挖了坑要跳的\n",
    "- 建议从简单的开始，然后面试官说还有其他方法么？再做延展：\n",
    "- ![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8mzet073zj31jw0u046i.jpg)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
